#include <iostream>
#include <stack>
#include <string>

using namespace std;

#define n 5
#define src 0
#define dst 1
#define buffer 2

stack<int> stks[3];


void print_stack(stack<int>& s)
{
    stack<int> tmp;
    while (!s.empty()) {
        int t = s.top();
        s.pop();
        tmp.push(t);
    }

    while (!tmp.empty()) {
        int t = tmp.top();
        tmp.pop();
        s.push(t);
        std::cout<<t<<" ";
    }
    std::cout<<std::endl;
}

void move(int _n, int _src, int _dst, int _buffer)
{
    if(_n > 0){
        move(_n -1, _src, _buffer, _dst);
        int d = stks[_src].top();
        stks[_src].pop();
        stks[_dst].push(d);

        std::cout<<"..............."<<std::endl;
        std::cout<<"src stack:"<<std::endl;
        print_stack(stks[src]);
        std::cout<<"dst stack:"<<std::endl;
        print_stack(stks[dst]);
        std::cout<<"buffer stack:"<<std::endl;
        print_stack(stks[buffer]);
        std::cout<<std::endl;

        move(_n - 1, _buffer, _dst, _src);
    }
}

int main(int argc, char *argv[])
{
    // init stack
    for(int i = n; i > 0; --i){
        stks[src].push(i);
    }

    // move value
    move(n, src, dst, buffer);

    return 0;
}
